/***************************************************
 * 此文件的版权归属xxxx公司所有，未经允许，请勿复制
 */
package com.pxxy.cels.service.impl;

import java.io.File;
import java.util.Map;

import com.pxxy.cels.cache.SimpleDataCache;
import com.pxxy.cels.dao.IBaseTermDao;
import com.pxxy.cels.dao.impl.BaseTermDaoImpl;
import com.pxxy.cels.exceptions.NoHistoryException;
import com.pxxy.cels.service.IGameService;

/************************************************
 * @author yejf
 * @since JDK7.0
 * @CreateDate 2020年4月9日 上午10:04:26
 * @description 此类用来描述了xxxxx
 *
 */
public class GameServiceImpl implements IGameService {

	private IBaseTermDao baseTermDao;

	// 构造方法
	public GameServiceImpl() {
		// 通过工厂来初始化dao 属性
		this.baseTermDao = new BaseTermDaoImpl();
	}

	/*
	 * 此方法是为获取所有还没有完成的 提示英文，回到中文 的数据 注： 数据来源有两个地方： 1. 从原始数据中获取所有的单词和词汇 2.
	 * 从之前保存过的历史文件中读取的数据 到底返回哪个数据，取决于参数 isNew 如果 isNew为真，则返回1 否则，返回2
	 * 
	 * @param isNew 此参数决定本方法的数据来源
	 * 
	 * @return
	 * 
	 * @see com.tz.cels.service.IGameService#en2cn(boolean)
	 */
	@Override
	public Map<String, String> en2cn(boolean isNew) throws NoHistoryException {
		// 2.根据 参数 isNew来决定从哪个数据源获取这些数据
		if (isNew) {
			// 返回原始数据
			return SimpleDataCache.getInstance().loadEn2CnMap();
		} else {
			// 返回从保存的历史记录中获取的数据
			File en2cnFile = new File(HISTORY_DIR+File.separatorChar+EN_TO_CN_FILE);
			// 判断此文件是否存在，如果不存在，直接抛出异常
			if (!en2cnFile.exists()) {
				throw new NoHistoryException("你还没有过历史记录");
			}
			// 说明这个文件是存在的
			return baseTermDao.readFromFile(en2cnFile.getAbsolutePath());
		}
	}

	/*
	 * 此方法是为获取所有还没有完成的 提示中文，回答英文 的数据 注： 数据来源有两个地方： 1. 从原始数据中获取所有的单词和词汇 2.
	 * 从之前保存过的历史文件中读取的数据 到底返回哪个数据，取决于参数 isNew 如果 isNew为真，则返回1 否则，返回2
	 * 
	 * @param isNew 此参数决定本方法的数据来源
	 * 
	 * @return
	 * 
	 * @see com.tz.cels.service.IGameService#cn2en(boolean)
	 */
	@Override
	public Map<String, String> cn2en(boolean isNew) throws NoHistoryException {
		// 1.根据 参数 isNew来决定从哪个数据源获取这些数据
		if (isNew) {
			// 返回原始数据
			return SimpleDataCache.getInstance().loadcn2EnMap();
		} else {
			// 返回从保存的历史记录中获取的数据
			File cn2enFile = new File(HISTORY_DIR+File.separatorChar+CN_TO_EN_FILE);
			// 判断此文件是否存在，如果不存在，直接抛出异常
			if (!cn2enFile.exists()) {
				throw new NoHistoryException("你还没有过CN2EN的历史记录");
			}
			// 说明这个文件是存在的
			return baseTermDao.readFromFile(cn2enFile.getAbsolutePath());
		}
	}

	/*
	 * 持久化没有被用户所答的单词和词汇, 第二个参数 en2cn为true，则把此数据持化久到 en2cn.his 文件 否则，持久化到 cn2en.his
	 * 文件
	 * 
	 * @param map
	 * 
	 * @param en2cn
	 * 
	 * @see com.tz.cels.service.IGameService#saveGameHistory(java.util.Map, boolean)
	 */
	@Override
	public void saveGameHistory(Map<String, String> map, boolean en2cn) {
		// 先判断父目录是否存在
		File parent = new File(HISTORY_DIR);
		if (!parent.exists()) {
			parent.mkdirs(); // 以保证目录结构存在
		}
		File targetFile = null;
		// 判断 en2cn的值
		if (en2cn) {
			// 说明需要把数据持久化到 en2cn的文件中
			targetFile = new File(parent,EN_TO_CN_FILE);
		} else {
			// 说明需要把数据持久化到 cn2en的文件中
			targetFile = new File(parent,CN_TO_EN_FILE);
		}
		// 最后，调用dao的方法即可
		baseTermDao.writeToFile(map, targetFile.getAbsolutePath());
	}

}
